package br.ufc.quixada.sitevendas.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.ufc.quixada.sitevendas.model.Produto;

public class ProdutoDAO implements IProdutoDAO{

	public Connection con;
	
	public ProdutoDAO() throws SQLException{
			new ConnectionFactory();
			this.con =ConnectionFactory.getConnection();
	}
	
	
	public void insere(Produto produto) {
		Connection con = null;
		String sql = "insert into produtos"+
					"(nome, fabricante, preco, qtd_estoque, descricao, codigo_categoria)"+
					"values (?,?,?,?,?,?)";
		try {
			con = ConnectionFactory.getConnection();
			PreparedStatement stmt = con.prepareStatement(sql);
			stmt.setString(1, produto.getNome());
			stmt.setString(2, produto.getFabricante());
			stmt.setFloat(3, produto.getPreco());
			stmt.setInt(4, produto.getQtd_estoque());
			stmt.setString(5, produto.getDescricao());
			stmt.setInt(6, produto.getCodigo_categoria());
			stmt.executeUpdate();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void altere(Produto produto){
		Connection con = null;
		String sql = "update produtos set nome=?, fabricante=?, preco=?," +
	             "qtd_estoque=?, decricao=?, codigo_categoria=? where codigo=?";
	     try {
	    	 con = ConnectionFactory.getConnection();
	         PreparedStatement stmt = con.prepareStatement(sql);
	         stmt.setString(1, produto.getNome());
	         stmt.setString(2, produto.getFabricante());
	         stmt.setFloat(3, produto.getPreco());
	         stmt.setInt(4, produto.getQtd_estoque());
	         stmt.setString(5, produto.getDescricao());
	         stmt.setInt(6, produto.getCodigo_categoria());
	         stmt.setInt(7, produto.getCodigo());
	         stmt.executeUpdate();
	         stmt.close();
	     } catch (SQLException e) {
	         throw new RuntimeException(e);
	     } finally {
				if (con != null) {
					try {
						con.close();
					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
			}
	}
	
	public void remove(int id) {
		Connection con = null;
		String sql = "delete from produtos where codigo=?";
		try {
			con = ConnectionFactory.getConnection();
			PreparedStatement stmt = con.prepareStatement(sql);
			stmt.setInt(1, id);
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public List<Produto> list() {
		Connection con = null;
		String sql= "select * from produtos";
		List<Produto> listaDeProdutos = new ArrayList<Produto>();
		try {
			con = ConnectionFactory.getConnection();
			PreparedStatement stmt = con.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				Produto produto = new Produto();
				produto.setCodigo(rs.getInt("codigo"));
				produto.setNome(rs.getString("nome"));
				produto.setFabricante(rs.getString("fabricante"));
				produto.setPreco(rs.getFloat("preco"));
				produto.setQtd_estoque(rs.getInt("qtd_estoque"));
				produto.setDescricao(rs.getString("descricao"));
				produto.setCodigo_categoria(rs.getInt("codigo_categoria"));
				listaDeProdutos.add(produto);
			}
			rs.close();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	
		return listaDeProdutos;
	}

	public List<Produto> list(String nome) {
		Connection con = null;
		String sql= "select * from produtos where nome like ?";
		List<Produto> listaDeProdutos = new ArrayList<Produto>();
		try {
			con = ConnectionFactory.getConnection();
			PreparedStatement stmt = con.prepareStatement(sql);
			stmt.setNString(1, nome);
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				Produto produto = new Produto();
				produto.setCodigo(rs.getInt("codigo"));
				produto.setNome(rs.getString("nome"));
				produto.setFabricante(rs.getString("fabricante"));
				produto.setPreco(rs.getFloat("preco"));
				produto.setQtd_estoque(rs.getInt("qtd_estoque"));
				produto.setDescricao(rs.getString("descricao"));
				produto.setCodigo_categoria(rs.getInt("codigo_categoria"));
				listaDeProdutos.add(produto);
			}
			rs.close();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return listaDeProdutos;
	}
	
	public List<Produto> list(int codigo) {
		Connection con = null;
		String sql= "select * from produtos where codigo=?";
		List<Produto> listaDeProdutos = new ArrayList<Produto>();
		try {
			con = ConnectionFactory.getConnection();
			PreparedStatement stmt = con.prepareStatement(sql);
			stmt.setInt(1, codigo);
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				Produto produto = new Produto();
				produto.setCodigo(rs.getInt("codigo"));
				produto.setNome(rs.getString("nome"));
				produto.setFabricante(rs.getString("fabricante"));
				produto.setPreco(rs.getFloat("preco"));
				produto.setQtd_estoque(rs.getInt("qtd_estoque"));
				produto.setDescricao(rs.getString("descricao"));
				produto.setCodigo_categoria(rs.getInt("codigo_categoria"));
				listaDeProdutos.add(produto);
			}
			rs.close();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return listaDeProdutos;
	}
}